package empty.dsa.util

object dsaParam { 
    /**
     * IBParam: input buffer parameter
     * @param maxDelay 最大延迟
     * @param width 宽度
     * @param deviceName 设备名称
     */
    class IBParam(maxDelay_ : Int, width_ : Int, deviceName_ : String) {
        val maxDelay = maxDelay_
        val width = width_
        val deviceName = deviceName_
    }
    /**
     * IBParam伴生对象，快速创建IBParam
     * @param maxDelay
     * @param width
     * @param deviceName
     * @return IBParam
     */
    object IBParam {
        def apply(maxDelay_ : Int, width_ : Int, deviceName_ : String): IBParam = {
            new IBParam(maxDelay_, width_, deviceName_)
        }
    }
    /**
     * OBParam: output buffer parameter
     * @param inPortsNum 输入端口数量
     * @param width 宽度
     * @param deviceName 设备名称
     */
    class OBParam(inPortsNum_ : Int, width_ : Int, deviceName_ : String) {
        val inPortsNum = inPortsNum_
        val width = width_
        val deviceName = deviceName_
    }
    /**
     * OBParam伴生对象，快速创建OBParam
     * @param inPortsNum
     * @param width
     * @param deviceName
     * @return OBParam
     */
    object OBParam {
        def apply(inPortsNum_ : Int, width_ : Int, deviceName_ : String): OBParam = {
            new OBParam(inPortsNum_, width_, deviceName_)
        }
    }
    /**
     * MuxParam: multiplexer parameter
     * @param inPortsNum 输入端口数量
     * @param width 宽度
     * @param deviceName 设备名称
     */
    class MuxParam(inPortsNum_ : Int, width_ : Int, deviceName_ : String) {
        val inPortsNum = inPortsNum_
        val width = width_
        val deviceName = deviceName_
    }
    /**
     * MuxParam伴生对象，快速创建MuxParam
     * @param inPortsNum
     * @param width
     * @param deviceName
     * @return MuxParam
     */
    object MuxParam {
        def apply(inPortsNum_ : Int, width_ : Int, deviceName_ : String): MuxParam = {
            new MuxParam(inPortsNum_, width_, deviceName_)
        }
    }
    /**
     * alu_Param: alu parameter
     * @param alu_type ALU类型
     * @param in_num 输入参数个数
     * @param out_num 输出参数个数
     * @param Param List[Int] ALU参数
     * @param alu_name ALU名称
     */
    class alu_Param(alu_type_ : String, in_num_ : Int, out_num_ : Int, Param_ : List[Int], alu_name_ : String) {
        val alu_type = alu_type_
        val in_num = in_num_
        val out_num = out_num_
        val param = Param_
        val alu_name = alu_name_
    }
    /**
     * alu_Param伴生对象，快速创建alu_Param
     * @param alu_type
     * @param in_num
     * @param out_num
     * @param Param
     * @param alu_name
     * @return alu_Param
     */
     object alu_Param {
        def apply(alu_type_ : String, in_num_ : Int, out_num_ : Int, Param_ : List[Int], alu_name_ : String): alu_Param = {
            new alu_Param(alu_type_, in_num_, out_num_, Param_, alu_name_)
        }
    }
    /**
     * PEParam: PE parameter
     * @param width 宽度
     * @param deviceName 设备名称
     * @param alu_num ALU数量
     * @param alu_Params List[alu_Param] ALU参数列表
     */
    class PEParam(width_ : Int, deviceName_ : String, alu_num_ : Int, alu_Params_ : List[alu_Param]) {
        val width = width_
        val deviceName = deviceName_
        val alu_num = alu_num_
        val alu_Params = alu_Params_
    }
    /**
     * PEParam伴生对象，快速创建PEParam
     * @param width
     * @param deviceName
     * @param alu_num
     * @param alu_Params
     * @return PEParam
     */
     object PEParam {
        def apply(width_ : Int, deviceName_ : String, alu_num_ : Int, alu_Params_ : List[alu_Param]): PEParam = {
            new PEParam(width_, deviceName_, alu_num_, alu_Params_)
        }
    }
    /**
     * dsa_Param: dsa parameter
     * @param PE_num PE数量
     * @param IB_num IB数量
     * @param OB_num OB数量
     * @param peParams List[PEParam] PE参数列表
     */
    class dsa_Param(PE_num_ : Int, IB_num_ : Int, OB_num_ : Int, peParams_ : List[PEParam]) {
        val PE_num = PE_num_
        val IB_num = IB_num_
        val OB_num = OB_num_
        val peParams = peParams_
    }
    /**
     * dsa_Param伴生对象，快速创建dsa_Param
     * @param PE_num
     * @param IB_num
     * @param OB_num
     * @param peParams
     * @return dsa_Param
     */
     object dsa_Param {
        def apply(PE_num_ : Int, IB_num : Int, OB_num_ : Int, peParams_ : List[PEParam]): dsa_Param = {
            new dsa_Param(PE_num_, IB_num, OB_num_, peParams_)
        }
    }
    /**
     * DPM_Param: DPM parameter
     * @param IN_num 输入参数个数
     * @param OUT_num 输出参数个数
     * @param Width 宽度
     */
    class DPM_Param(IN_num_ : Int, OUT_num_ : Int, Width_ : Int) {
        val IN_num = IN_num_
        val OUT_num = OUT_num_
        val Width = Width_
    }
    /**
     * DPM_Param伴生对象，快速创建DPM_Param
     * @param IN_num
     * @param OUT_num
     * @param Width
     * @return DPM_Param
     */
     object DPM_Param {
        def apply(IN_num_ : Int, OUT_num_ : Int, Width_ : Int): DPM_Param = {
            new DPM_Param(IN_num_, OUT_num_, Width_)
        }
    }
    /**
     * Connect
     * @param Out_obj 输出对象
     * @param out_No 输出数量
     * @param In_obj 输入对象
     * @param in_No 输入数量
    */
    class Connect(Out_obj_ : String, out_No_ : Int, In_obj_ : String, in_No_ : Int) {
        val Out_obj = Out_obj_
        val out_No = out_No_
        val In_obj = In_obj_
        val in_No = in_No_
    }
    /**
     * Connect的伴生对象，快速创建Connect
     * @param Out_obj_
     * @param out_No_
     * @param In_obj_
     * @param in_No_
    */
    object Connect{
        def apply(Out_obj_ : String, out_No_ : Int, In_obj_ : String, in_No_ : Int) : Connect = {
            new Connect(Out_obj_, out_No_, In_obj_, in_No_)
        }
    }
    /**
     * Connect Parameter
     * @param cn_ 连接对象列表
    */
    class Connect_Params(cn_ : List[Connect]) {
        val cn = cn_
        val cn_length = cn.length
    }
    /**
     * Connect_Params的伴生对象，快速创建Connect_Params
    */
    object Connect_Params{
        def apply(cn_ : List[Connect]) : Connect_Params = {
            new Connect_Params(cn_)
        }
    }
  
}